﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Simulator
{
    public class Submodule : Block {

        /// <summary>
        /// Пустой конструктор по умолчанию
        /// </summary>
        public Submodule() {
            m_diagramm = new List<Block>();
        }

        /// <summary>
        /// список блоков субмодуля
        /// </summary>
        private List<Block> m_diagramm;

        /// <summary>
        /// уникальное имя-идентификатор
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// то, что будет написано на блоке и отображено 
        /// в гуе
        /// </summary>
        public string Text { get; set; }

        /// <summary>
        /// класс возвращаемых значений
        /// </summary>
        public class ReturnCodes {
            public static int OK = 0;
            public static int FAIL = -1;
        }

        /// <summary>
        /// получить количество
        /// входных шлюзов субмодуля
        /// </summary>
        /// <param name="val"></param>
        /// <returns></returns>
        public int getInputsCnt(ref int val) {
            string name = "Simulator.Gateway";
            int counter = 0;
            for (int i = 0; i < m_diagramm.Count; i++) {

                if (m_diagramm[i].GetType().ToString() == name) {

                    int direction = 0;
                    if (((Gateway)m_diagramm[i]).getDirection(ref direction) 
                        != Gateway.Constants.OK) {
                            return ReturnCodes.FAIL;
                    }

                    if (direction == Gateway.Constants.IN) {
                        counter++;
                    }
                }
            }
            val = counter;
            return ReturnCodes.OK;
        }

        /// <summary>
        /// получить количество выходных шлзов
        /// субмодуля
        /// </summary>
        /// <param name="val"></param>
        /// <returns></returns>
        public int getOutputsCnt(ref int val) {
            string name = "Simulator.Gateway";
            int counter = 0;
            for (int i = 0; i < m_diagramm.Count; i++) {

                if (m_diagramm[i].GetType().ToString() == name) {

                    int direction = 0;
                    if (((Gateway)m_diagramm[i]).getDirection(ref direction)
                        != Gateway.Constants.OK) {
                        return ReturnCodes.FAIL;
                    }

                    if (direction == Gateway.Constants.OUT) {
                        counter++;
                    }
                }
            }
            val = counter;
            return ReturnCodes.OK;
        }

        /// <summary>
        /// расшириться-выдать в модель блоки
        /// </summary>
        /// <param name="val"></param>
        /// <returns></returns>
        public int expand(ref List<Block> val) {
            val.Clear();
            val = new List<Block>(m_diagramm);
            return ReturnCodes.OK;
        }

        /// <summary>
        /// очистить список блоков
        /// </summary>
        /// <returns></returns>
        public int clear() {
            m_diagramm.Clear();
            return ReturnCodes.OK;
        }

        /// <summary>
        /// добавить еще блоки к субмодулю
        /// </summary>
        /// <param name="val"></param>
        /// <returns></returns>
        public int addBlocks(ref List<Block> val) {
            m_diagramm.AddRange(val);
            return ReturnCodes.OK;
        }

        /// <summary>
        /// самопроверка субмодуля
        /// </summary>
        /// <returns></returns>
        public int getCorrect() {
            string name = "Simulator.Gateway";
            int counterIn = 0;
            int counterOut = 0;

            for (int i = 0; i < m_diagramm.Count; i++) {

               if (m_diagramm[i].GetType().ToString() == name) {

                    int direction = 0;
                    if (((Gateway)m_diagramm[i]).getDirection(ref direction)
                        != Gateway.Constants.OK) {
                        return ReturnCodes.FAIL;
                    }

                    if (direction == Gateway.Constants.IN) {
                        counterIn++;
                    }

                    if (direction == Gateway.Constants.OUT) {
                        counterOut++;
                    }
                }
            }

            if ((counterIn < 1) || (counterOut < 1)) {
                return ReturnCodes.FAIL;
            }

            return ReturnCodes.OK;
        }

        /// <summary>
        /// положить сущность в следующий
        /// блок
        /// </summary>
        /// <param name="e"></param>
        public override void PutEntity(ref Entity e) { }

        /// <summary>
        /// ичего не делать - заглушка
        /// </summary>
        public override void ClearEntities() { }
    }
    
}
